<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// // const $a = 1;
	// // const a$ = 2;
	// // const _a = 3;
	// // console.log($a,a$)
	// function $a (){
	//
	// }
	
	// 定义一个名字为fn的函数，接收的形参a,b
	// function fn(a, b) {
	// 	// 函数体--》代码块
	// 	return a + b;// 返回a+b;
	// }
	// fn(1,2);// 调用名字为fn的函数，传递的实参：1，2
	
	
	// 注意1：如果实参数量大于形参数量， 多出来的实参，将被忽略。
	//       如果实参数量小于形参数量， 有的形参没有对应的实参，取默认值 undefined
	// function fn(a,b){
	// 	console.log(a,b,arguments,Array.from(arguments))
	// }
	// fn(1,2,3);// 如果实参数量大于形参数量， 多出来的实参，将被忽略。
	// fn(1);// 如果实参数量小于形参数量， 有的形参没有对应的实参，取默认值 undefined
	
	// 注意2： JS函数允许形参有默认值，有默认值的形参，在调用函数的时候，可以没有与之对应的实参！
	// function fn(a=1,b=2){
	// 	console.log(a,b);// 1 2
	// }
	// fn();
	
	
	
	
	// **返回值**：函数调用表达式的结果
	// * `函数名()` 被称之为**函数调用表达式**， 表达式的值就是函数的**返回值**。
	// function fn(){
	// 	return 100
	// }
	// const num = fn();// 函数调用表达式
	// console.log(num);// 100
	
	
	
	// * 在函数体内，`return` 右边的表达式（或变量、直接量）便是函数的返回值。
	// function fn(){
	// 	// return 100;// 直接量
	// 	let a = 90;
	// 	return a;// 90
	// }
	// console.log(fn());
	
	// * 函数体内没写 `return` 或者 `return` 的右边是空的，默认会返回 `undefined`。
	// function fn(){};
	// console.log(fn());// undefined
	//
	// function run(){
	// 	return;
	// }
	// console.log(run());// undefined
	// * `return` 除了设置返回值外，还可以结束函数的执行，return 之后的代码不会执行。
	// function fn(){
	// 	console.log(1);
	// 	return;// 结束函数后续代码的执行，右侧的内容即是返顺的内容。
	// 	console.log(100);
	// }
	// fn();
	
	
	// 如何定义函数
	// - 函数声明
	// function fn(){
	//
	// }
	// - 表达式
	// const fn = function(a,b){
	// 	return a+b;
	// }
	// - 实例化函数对象（了解）
	// const fn = new Function("a","b","return a+b");
	// const num = fn(1,2);
	// console.log(num);// 3
	
	
	
	// 调用（执行）函数
	
	// // 定义了一个名字为fn的常量，值的类型是一个函数
	// const fn = function(){
	//
	// }
	// fn();
	// // 声明了一个名字为fn2的函数。
	// function fn2(){
	//
	// }
	// fn2();
	
	
	// * 直接调用
	// function fn(){
	//
	// }
	// fn();
	
	
	// * new 操作符
	// function Fn(){
	// 	this.a = 1;
	// 	this.b = 2;
	// }
	// const obj = new Fn();
	
	
	// * apply
	// function fn(){
	// 	console.log("fn",this)
	// }
	// fn.apply()
	// * call
	// function fn(){
	// 	console.log("fn")
	// }
	// fn.call();
	// * bind-->绑定this与参数
	// function fn(){
	// 	console.log("fn",this);
	// }
	// const run = fn.bind();
	// run();
	//
	// fn.bind()();
	
	
	// 函数声明：函数声明提升：执行代码之前会将先读取函数声明，也就说可以先调用，再声明。

	// fn();
	// function fn(){
	//
	// }
	// fn();
	
	
	// 函数的2种角色
	function fn(){
		console.log("fn")
	}
	// - 函数: 通过()使用
	fn();
	// - 对象: 通过.使用
	fn.userName = "lisi";
	fn.run = function(){
		console.log("run");
	}
	console.log(fn.userName);// lisi
	fn.run();
</script>
</html>